import {baseURL, useMemberStore} from "@/stores"
import type ApiResponseData from "@/types/api";


// // 修改请求基地址为本机局域网IP（需替换为实际IP）
// const baseURL = 'http://192.168.8.140:8080/api/v1' // 请将IP替换为本机实际局域网IP

// 拦截器配置
const httpInterceptor = {
    // 拦截前触发
    invoke(options: UniApp.RequestOptions) {
        // 1. 非 http 开头需拼接地址
        if (!options.url.startsWith('http')) {
            options.url = baseURL + options.url
        }
        // 2. 请求超时
        options.timeout = 10000
        // 3. 添加小程序端请求头标识
        options.header = {
            'source-client': 'miniapp',
            'Content-Type': options.method?.toUpperCase() === 'GET'
                ? 'application/x-www-form-urlencoded'
                : 'application/json',
            ...options.header, // 优先保留原有header配置（将原有header放在最后合并保证优先级）
        }
        // 4. 添加 token 请求头标识
        const memberStore = useMemberStore()
        // 判断是否有这个属性
        const token = memberStore.profile
        if (token) {
            // 有token添加到请求头
            options.header.Authorization = "Bearer " + token
        }
    },
}

// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)
// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)


export const request = <T>(options: UniApp.RequestOptions) => {
    // 返回Promise对象
    return new Promise<ApiResponseData<T>>((resolve, reject) => {
        // 1. 请求成功
        uni.request({
            ...options,
            success(res) {
                // 状态码2xx开头
                let data = res.data as ApiResponseData<T>;
                if (res.statusCode >= 200 && res.statusCode < 300) {
                    if (data.code == 401) {
                        // token 失效
                        // 1. 清除本地 token
                        useMemberStore().clearProfile()
                        // 2. 跳转登录页
                        uni.navigateTo({url: '/pages/login/login'}).then(() => {
                        })
                        // 3. 提示用户重新登录
                        uni
                            .showToast({
                                title: '登录状态已过期，请重新登录',
                                icon: 'none',
                            })
                            .then(() => {
                            })
                        reject(res)
                    } else if (data.code == 0) {
                        resolve(data)
                    } else {
                        // 提示错误信息
                        uni
                            .showToast({
                                title: data.message || '请求失败',
                                icon: 'none',
                            })
                            .then(() => {
                            })
                        reject(res)
                    }


                } else if (res.statusCode == 401) {
                    // token 失效
                    // 1. 清除本地 token
                    useMemberStore().clearProfile()
                    // 2. 跳转登录页
                    uni.navigateTo({url: '/pages/login/login'}).then(() => {
                    })
                    // 3. 提示用户重新登录
                    uni
                        .showToast({
                            title: '登录状态已过期，请重新登录',
                            icon: 'none',
                        })
                        .then(() => {
                        })
                    reject(res)
                } else {
                    uni
                        .showToast({
                            title: data.message || '请求失败',
                            icon: 'none',
                        })
                        .then(() => {
                        })
                    reject(res)
                }
            },
            // 2. 请求失败
            fail(err) {
                uni
                    .showToast({
                        title: '网络错误，换个网络试试',
                        icon: 'none',
                    })
                    .then(() => {
                    })
                reject(err)
            },
        })
    })
}
